home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 2 / Amiga Tools 2.iso / grafik / bildanzeiger / seepix / source.lha / Palette.c < prev    next >
C/C++ Source or Header  |  1992-11-27  |  18KB  |  644 lines

  1. /**Palette.c*************************************************************
  2.  *                                    *
  3.  *   SeePix -- by Hank Schafer                        *
  4.  *                                    *
  5.  *   SeePix is an IFF Picture Viewer.  It works with Lo-Res,        *
  6.  *   Med-Res, Hi-Res, HAM, and EHB formats.  I'm working on support     *
  7.  *   for X-Specs, and Anim5 formats.                    *
  8.  *                                    *
  9.  *   SeePix is based on a program by Olaf Barthel, called        *
  10.  *   'LoadImage'.  As released, LoadImage had a couple of bugs.     *
  11.  *   The Amiga-Key alternatives to menu use didn't all work.  That's    *
  12.  *   been fixed.  There were two separate print functions in LoadImage    *
  13.  *   which behaved exactly the same.  The redundancy was eliminated.    *
  14.  *   LoadImage used the Topaz ROMFONT, and made no allowances for a    *
  15.  *   different system default font (under 2.04).  I added a built-in    *
  16.  *   font.  I've reworked the code considerably from the original       *
  17.  *   release, to allow for optimizations based on time and space.    *
  18.  *                                    *
  19.  *   SeePix features a palette tool which allows "tweaking" of colors    *
  20.  *   prior to printing, allowing you to modify the color printout to    *
  21.  *   more closely resemble the original graphics (Blue is Blue, not    *
  22.  *   Purple).  SeePix can be Iconified.  SeePix features an ARP     *
  23.  *   interface.  SeePix now uses the PathMaster File Selector.        *
  24.  *                                    *
  25.  ************************************************************************
  26.  *                                                                      *
  27.  *   SeePix Copyright © 1992 by Hank Schafer; all rights reserved.      *
  28.  *                                                                      *
  29.  *   This program is free software; you can redistribute it and/or      *
  30.  *   modify it under the terms of the GNU General Public License as     *
  31.  *   published by the Free Software Foundation, either version 1, or    *
  32.  *   (at your option) any later version.                                *
  33.  *                                                                      *
  34.  *   This program is distributed in the hope that it will be useful,    *
  35.  *   but WITHOUT ANY WARRANTY; without even the implied warranty of     *
  36.  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  *
  37.  *   General Public License for more details.                           *
  38.  *                                                                      *
  39.  *   You should have received a copy of the GNU General Public License  *
  40.  *   along with this program; if not, write to:                         *
  41.  *                 Free Software Foundation, Inc.                       *
  42.  *                 675 Massachusetts Ave.                               *
  43.  *                 Cambridge  MA  02139, USA                            *
  44.  *                                                                      *
  45.  **************** Special Function Copyright Notices ********************
  46.  *                                    *
  47.  ****LoadImage Copyright Notice:                    *
  48.  *                                    *
  49.  *   LoadImage is © Copyright 1988, 1989, 1990 by MXM, all rights    *
  50.  *   reserved, written by Olaf Barthel.  No guarantees of any kind are    *
  51.  *   made that this program is 100% reliable.  Use this program on    *
  52.  *   your own risk!                            *
  53.  *                                    *
  54.  ****Iconify Copyright Notice:                        *
  55.  *                                    *
  56.  *   Copyright 1987 by Leo L. Schwab.                    *
  57.  *   Permission is hereby granted for use in any and all programs,    *
  58.  *   both Public Domain and commercial in nature, provided this     *
  59.  *   Copyright notice is left intact.                    *
  60.  *                                    *
  61.  ****ColorWindow (Palette) Copyright Notice:                *
  62.  *                                    *
  63.  * ColorWindow Routine    --  Color Window Routines            *
  64.  *     from Book 1 of the Amiga Programmers' Suite by RJ Mical          *
  65.  *                                    *
  66.  * Copyright (C) 1986, 1987, Robert J. Mical                *
  67.  * All Rights Reserved.                         *
  68.  *                                    *
  69.  ****PathMaster Copyright Notice:                    *
  70.  *                                    *
  71.  * -------------------------------------------------------------------- *
  72.  *   Copyright © 1989 Justin V. McCormick.  All Rights Reserved.    *
  73.  * -------------------------------------------------------------------- *
  74.  *                                    *
  75.  *    The PathMaster name is a trademark of Justin V. McCormick.    *
  76.  *                                    *
  77.  *   PathMaster File Selector source and documentation written by:    *
  78.  *                                    *
  79.  *             Justin V. McCormick.                *
  80.  *           Copyright © 1989 by Justin V. McCormick.         *
  81.  *             All Rights Reserved.                *
  82.  *                                    *
  83.  * -------------------------------------------------------------------- *
  84.  ************************************************************************
  85.  *                                    *
  86.  *   Hope this is something you can use and enjoy.            *
  87.  *                                    *
  88.  ************************************************************************/
  89.  
  90. /*
  91.  * DoCWind(); and support functions - the palette requester
  92.  */
  93.  
  94. extern struct Gadget ColorTemplateGadgets[COLOR_GADGETS_COUNT];
  95. extern struct Image ColorPropsImages[3];
  96. extern struct PropInfo ColorPropsInfos[3];
  97. extern struct Image ColorRGBImage;
  98. extern struct Image ColorHSLImage;
  99. extern struct Image SuperColorImages[32];
  100. extern UWORD    RGBData[];
  101. extern UWORD    HSLData[];
  102.  
  103. UBYTE           *AllocRemember();
  104. struct IntuiMessage *GetMsg();
  105. struct Window  *OpenWindow();
  106.  
  107. /* ColorMode definitions */
  108.  
  109. #define COPYCOLOR    1
  110. #define RANGE_FIRST  2
  111. #define RANGE_SECOND 3
  112.  
  113. /* These are the dimensions of the color hit box */
  114.  
  115. #define COLOR_COLOR_ROWS    (4 * 10)
  116. #define COLOR_COLOR_COLS    (8 * 15)
  117. #define COLOR_COLOR_RIGHT   (COLOR_BOX_LEFT + COLOR_COLOR_COLS - 1)
  118. #define COLOR_COLOR_BOTTOM  (COLOR_COLOR_TOP + COLOR_COLOR_ROWS - 1)
  119.  
  120. VOID        ResetColorProps();
  121.  
  122. struct NewWindow ColorNewWindow =
  123. {
  124.     20, 12,            /* LeftEdge, TopEdge */
  125.     COLORWINDOW_WIDTH, COLORWINDOW_HEIGHT,    /* Width, Height */
  126.     -1, -1,            /* FrontPen, BackPen */
  127.     GADGETDOWN | GADGETUP | MOUSEBUTTONS | MENUPICK | MOUSEMOVE | ACTIVEWINDOW | INACTIVEWINDOW,    /* IDCMP Flags */
  128.     WINDOWDRAG | SMART_REFRESH | NOCAREREFRESH | ACTIVATE,    /* Flags */
  129.     &ColorTemplateGadgets[COLOR_GADGETS_COUNT - 1],    /* First Gadget */
  130.     NULL,            /* CheckMark */
  131.     (UBYTE *) "Print Palette:",    /* Title */
  132.     NULL,            /* Screen */
  133.     NULL,            /* BitMap */
  134.     0, 0,            /* Minimum Width & Height */
  135.     0, 0,            /* Maximum Width & Height */
  136.     CUSTOMSCREEN,        /* Type */
  137. };
  138.  
  139. UWORD        ColorMode;
  140. UWORD        RangeFirst;
  141. struct Window  *ColorWindow = NULL;
  142. struct RastPort *ColorRPort;
  143. struct ViewPort *ColorVPort;
  144. WORD        RowCount, RowHeight, ColumnCount, ColumnWidth;
  145. UWORD        SavePalette[32];
  146.  
  147. /* ======================================================================= */
  148. /* === These Routines Open, Render, and Close the Color Window =========== */
  149. /* ======================================================================= */
  150.  
  151. VOID
  152. InitColorSizes(depth)
  153.     WORD        depth;
  154.  
  155. /*
  156.  * This routine adjusts the row and column variables based on the number of
  157.  * colors supported by the ColorWindow's screen.
  158.  */
  159.  
  160. {
  161.     RowCount = 1 << (depth >> 1);
  162.     RowHeight = COLOR_COLOR_ROWS / RowCount;
  163.  
  164.     ColumnCount = 1 << ((depth + 1) >> 1);
  165.     ColumnWidth = COLOR_COLOR_COLS / ColumnCount;
  166. }
  167.  
  168. VOID
  169. DrawBox(rp, left, top, right, bottom)
  170.     struct RastPort *rp;
  171.     WORD        left, top, right, bottom;
  172.  
  173. /* A quick utility routine */
  174.  
  175. {
  176.     WORD        savepen;
  177.  
  178.     savepen = ColorRPort->FgPen;
  179.  
  180.     SetAPen(rp, 1);
  181.     SetDrMd(rp, JAM2);
  182.  
  183.     Move(rp, left, top);
  184.     Draw(rp, left, bottom);
  185.     Draw(rp, right, bottom);
  186.     Draw(rp, right, top);
  187.     Draw(rp, left, top);
  188.  
  189.     SetAPen(ColorRPort, savepen);
  190. }
  191.  
  192. VOID
  193. ColorRectFill(pen)
  194.     WORD        pen;
  195.  
  196. /*
  197.  * This routine sets the pen in the RastPort as the current pen selected by
  198.  * the user, and then fills the color box with that pen color.
  199.  */
  200.  
  201. {
  202.     SetAPen(ColorRPort, pen);
  203.     SetDrMd(ColorRPort, JAM1);
  204.     RectFill(ColorRPort, COLOR_BOX_LEFT, COLOR_BOX_TOP, COLOR_BOX_RIGHT, COLOR_BOX_BOTTOM);
  205. }
  206.  
  207. VOID
  208. DrawColorWindow()
  209. /* This routine fills in all the graphic details of the ColorWindow */
  210.  
  211. {
  212.     WORD        col, row, colstart, colend, rowstart;
  213.     WORD        savepen;
  214.  
  215.     savepen = ColorRPort->FgPen;
  216.  
  217.     InitColorSizes(ColorRPort->BitMap->Depth);
  218.  
  219.     ColorRectFill(ColorRPort->FgPen);
  220.  
  221.     DrawBox(ColorRPort, COLOR_BOX_LEFT - 2, COLOR_BOX_TOP - 2, COLOR_BOX_RIGHT + 2, COLOR_BOX_BOTTOM + 2);
  222.     DrawBox(ColorRPort, COLOR_BOX_LEFT - 2, COLOR_COLOR_TOP - 2, COLOR_BOX_LEFT + (8 * 15) + 1, COLOR_COLOR_TOP + (4 * 10) + 1);
  223.  
  224.     colstart = COLOR_BOX_LEFT;
  225.     colend = colstart + ColumnWidth - 1;
  226.     for (col = 0; col < ColumnCount; col++) {
  227.     rowstart = COLOR_COLOR_TOP;
  228.     for (row = 0; row < RowCount; row++) {
  229.         SetAPen(ColorRPort, (row * ColumnCount) + col);
  230.         RectFill(ColorRPort, colstart, rowstart, colend, rowstart + RowHeight - 1);
  231.         rowstart += RowHeight;
  232.     }
  233.     colstart += ColumnWidth;
  234.     colend += ColumnWidth;
  235.     }
  236.  
  237.     SetAPen(ColorRPort, savepen);
  238. }
  239.  
  240. struct Window  *
  241. OpenColorWindow(screen, firstpen)
  242.     struct Screen  *screen;
  243.     WORD        firstpen;
  244. {
  245.     WORD        i;
  246.  
  247.     ColorNewWindow.Screen = screen;
  248.     ColorNewWindow.Type = CUSTOMSCREEN;
  249.  
  250.     if ((ColorWindow = OpenWindow(&ColorNewWindow)) == 0)
  251.     return (NULL);
  252.  
  253.     ColorVPort = &ColorWindow->WScreen->ViewPort;
  254.     ColorRPort = ColorWindow->RPort;
  255.  
  256.     for (i = 0; i < 32; i++)
  257.     SavePalette[i] = GetRGB4(ColorVPort->ColorMap, i);
  258.  
  259.     SetAPen(ColorRPort, firstpen);
  260.     ResetColorProps();
  261.     DrawColorWindow();
  262.  
  263.     ColorMode = NULL;
  264.  
  265.     return (ColorWindow);
  266. }
  267.  
  268. VOID
  269. CloseColorWindow(accept)
  270.     BOOL        accept;
  271. {
  272.     if (ColorWindow == NULL)
  273.     return;
  274.  
  275.     if (NOT accept)
  276.     LoadRGB4(ColorVPort, &SavePalette[0], 32);
  277.  
  278.     CloseWindow(ColorWindow);
  279.     ColorWindow = NULL;
  280. }
  281.  
  282. /* ======================================================================= */
  283. /* === These Routines Manage the User Interaction ======================== */
  284. /* ======================================================================= */
  285.  
  286. BOOL
  287. ColorGadgetGotten(gadget)
  288.     struct Gadget  *gadget;
  289.  
  290. /*
  291.  * This routine manages the user's gadget selection.  If one of the end
  292.  * gadgets, such as OK or CANCEL, was selected then this routine returns
  293.  * FALSE, else it returns TRUE.
  294.  */
  295.  
  296. {
  297.     switch (gadget->GadgetID) {
  298.     case COLOR_OK:
  299.     CloseColorWindow(TRUE);
  300.     PrintPix();
  301.     return (FALSE);
  302.     break;
  303.     case COLOR_CANCEL:
  304.     CloseColorWindow(FALSE);
  305.     return (FALSE);
  306.     break;
  307.     case COLOR_COPY:
  308.     ColorMode = COPYCOLOR;
  309.     break;
  310.     case COLOR_RANGE:
  311.     ColorMode = RANGE_FIRST;
  312.     break;
  313.     case COLOR_HSL_RGB:
  314.     ResetColorProps();
  315.     break;
  316.     }
  317.     return (TRUE);
  318. }
  319.  
  320. VOID
  321. ColorRange(first, last)
  322.     WORD        first, last;
  323.  
  324. /* Create the color range from first to last */
  325.  
  326. {
  327.     WORD        i;
  328.     WORD        whole, redfraction, greenfraction, bluefraction, divisor;
  329.     UWORD        rgb;
  330.     WORD        firstred, firstgreen, firstblue;
  331.     WORD        lastred, lastgreen, lastblue;
  332.     WORD        workred, workgreen, workblue;
  333.  
  334.     /* If the pen numbers are out of order, swap */
  335.  
  336.     if (first > last) {
  337.     i = first;
  338.     first = last;
  339.     last = i;
  340.     }
  341.     /*
  342.      * I need to see a spread of at least two, where there's at least one
  343.      * spot between the endpoints, else there's no work to do so I might as
  344.      * well just return now.
  345.      */
  346.  
  347.     if (first >= last - 1)
  348.     return;
  349.  
  350.     rgb = GetRGB4(ColorVPort->ColorMap, first);
  351.     firstred = (rgb >> 8) & 0xF;
  352.     firstgreen = (rgb >> 4) & 0xF;
  353.     firstblue = (rgb >> 0) & 0xF;
  354.  
  355.     rgb = GetRGB4(ColorVPort->ColorMap, last);
  356.     lastred = (rgb >> 8) & 0xF;
  357.     lastgreen = (rgb >> 4) & 0xF;
  358.     lastblue = (rgb >> 0) & 0xF;
  359.  
  360.  
  361.     divisor = last - first;
  362.  
  363.     /*
  364.      * Do all math as fixed-point fractions where the low 8 bits are the
  365.      * fraction.  This greatly lessens the effect of rounding errors.
  366.      */
  367.  
  368.     whole = (lastred - firstred) << 8;
  369.     redfraction = whole / divisor;
  370.  
  371.     whole = (lastgreen - firstgreen) << 8;
  372.     greenfraction = whole / divisor;
  373.  
  374.     whole = (lastblue - firstblue) << 8;
  375.     bluefraction = whole / divisor;
  376.  
  377.     for (i = first + 1; i < last; i++) {
  378.     lastred = ((redfraction * (i - first)) + 0x0080) >> 8;
  379.     workred = firstred + lastred;
  380.     lastgreen = ((greenfraction * (i - first)) + 0x0080) >> 8;
  381.     workgreen = firstgreen + lastgreen;
  382.     lastblue = ((bluefraction * (i - first)) + 0x0080) >> 8;
  383.     workblue = firstblue + lastblue;
  384.     SetRGB4(ColorVPort, i, workred, workgreen, workblue);
  385.     }
  386. }
  387.  
  388. VOID
  389. ColorWindowHit(x, y)
  390.     WORD        x, y;
  391.  
  392. /*
  393.  * The color boxes at the bottom-right of the ColorWindow are not gadgets.
  394.  * Instead, it's just graphics and this routine is used to detect whether the
  395.  * user has selected one of the color boxes.
  396.  */
  397.  
  398. {
  399.     UWORD        rgb, pen;
  400.  
  401.     /* Have we got a color specifier? */
  402.  
  403.     if ((x >= COLOR_BOX_LEFT) && (x <= COLOR_COLOR_RIGHT) && (y >= COLOR_COLOR_TOP) && (y <= COLOR_COLOR_BOTTOM)) {
  404.  
  405.     /* Yes, it's one of the color boxes.  Set this pen number */
  406.  
  407.     x = x - COLOR_BOX_LEFT;
  408.     x = x / ColumnWidth;
  409.     y = y - COLOR_COLOR_TOP;
  410.     y = y / RowHeight;
  411.     pen = (y * ColumnCount) + x;
  412.  
  413.     /* first, were we in COPY COLOR mode? */
  414.  
  415.     if (ColorMode == COPYCOLOR) {
  416.  
  417.         /* ok, copy old color here first! */
  418.  
  419.         rgb = GetRGB4(ColorVPort->ColorMap, ColorRPort->FgPen);
  420.         SetRGB4(ColorVPort, pen, rgb >> 8, rgb >> 4, rgb);
  421.         ColorMode = NULL;
  422.     } else if (ColorMode == RANGE_FIRST) {
  423.         ColorMode = RANGE_SECOND;
  424.         RangeFirst = pen;
  425.     } else if (ColorMode == RANGE_SECOND) {
  426.         ColorMode = NULL;
  427.         ColorRange(RangeFirst, pen);
  428.     }
  429.     ColorRectFill(pen);
  430.  
  431.     ResetColorProps();
  432.     }
  433. }
  434.  
  435. VOID
  436. SetPropValueGrunt(value, y)
  437.     WORD        value, y;
  438. {
  439.     UBYTE        text[16];
  440.  
  441.     if (value >= 0)
  442.     sprintf(&text[0], "%ld ", value);
  443.     else {
  444.     text[0] = ' ';
  445.     text[1] = ' ';
  446.     }
  447.  
  448.     Move(ColorRPort, COLOR_VALUE_X, y);
  449.     Text(ColorRPort, &text[0], 2);
  450. }
  451.  
  452. VOID
  453. SetPropValues(red, green, blue)
  454.     WORD        red, green, blue;
  455.  
  456. /* Sets the text to the right of the prop gadgets */
  457.  
  458. {
  459.     WORD        savepen;
  460.  
  461.     savepen = ColorRPort->FgPen;
  462.  
  463.     SetAPen(ColorRPort, 1);
  464.     SetDrMd(ColorRPort, JAM2);
  465.  
  466.     SetPropValueGrunt(red, COLOR_VALUE_REDY);
  467.     SetPropValueGrunt(green, COLOR_VALUE_GREENY);
  468.     SetPropValueGrunt(blue, COLOR_VALUE_BLUEY);
  469.  
  470.     SetAPen(ColorRPort, savepen);
  471. }
  472.  
  473. VOID
  474. ModifyRGBColors()
  475. {
  476.     UWORD        newred, newgreen, newblue;
  477.  
  478.     newred = ColorPropsInfos[0].HorizPot >> 12;
  479.     newgreen = ColorPropsInfos[1].HorizPot >> 12;
  480.     newblue = ColorPropsInfos[2].HorizPot >> 12;
  481.  
  482.     SetRGB4(ColorVPort, ColorRPort->FgPen, newred, newgreen, newblue);
  483.     SetPropValues(newred, newgreen, newblue);
  484. }
  485.  
  486. VOID
  487. ModifyHSLColors()
  488. {
  489.     UWORD        rgb;
  490.  
  491.     rgb = (UWORD) HSLToRGB(ColorPropsInfos[0].HorizPot, ColorPropsInfos[1].HorizPot, ColorPropsInfos[2].HorizPot);
  492.  
  493.     SetRGB4(ColorVPort, ColorRPort->FgPen, rgb >> 8, rgb >> 4, rgb);
  494.     SetPropValues(-1, -1, -1);
  495. }
  496.  
  497. VOID
  498. ModifyColors()
  499. /* This routine reacts to the user playing with one of the prop gadgets */
  500.  
  501. {
  502.     if (ColorTemplateGadgets[COLOR_HSL_RGB].Flags & SELECTED)
  503.     ModifyHSLColors();
  504.     else
  505.     ModifyRGBColors();
  506. }
  507.  
  508. VOID
  509. SetRGBProps(rgb)
  510.     UWORD        rgb;
  511. {
  512.     UWORD        red, green, blue;
  513.  
  514.     red = (rgb >> 8) & 0xF;
  515.     green = (rgb >> 4) & 0xF;
  516.     blue = (rgb >> 0) & 0xF;
  517.  
  518.     ColorPropsInfos[0].HorizPot = (red << 12) | (red << 8) | (red << 4) | red;
  519.     ColorPropsInfos[1].HorizPot = (green << 12) | (green << 8) | (green << 4) | green;
  520.     ColorPropsInfos[2].HorizPot = (blue << 12) | (blue << 8) | (blue << 4) | blue;
  521.  
  522.     SetPropValues(red, green, blue);
  523. }
  524.  
  525. VOID
  526. SetHSLProps(rgb)
  527.     UWORD        rgb;
  528. {
  529.     RGBToHSL(rgb, &ColorPropsInfos[0].HorizPot, &ColorPropsInfos[1].HorizPot, &ColorPropsInfos[2].HorizPot);
  530.  
  531.     SetPropValues(-1, -1, -1);
  532. }
  533.  
  534. VOID
  535. ResetColorProps()
  536. /*
  537.  * This routine resets the proportional gadgets according to the current pen
  538.  * number and the interaction technique
  539.  */
  540.  
  541. {
  542.     WORD        bluepos;
  543.     UWORD        rgb;
  544.  
  545.     rgb = GetRGB4(ColorVPort->ColorMap, ColorRPort->FgPen);
  546.  
  547.     bluepos = RemoveGList(ColorWindow, &ColorTemplateGadgets[COLOR_BLUE], 3);
  548.  
  549.     if (ColorTemplateGadgets[COLOR_HSL_RGB].Flags & SELECTED)
  550.     SetHSLProps(rgb);
  551.     else
  552.     SetRGBProps(rgb);
  553.  
  554.     AddGList(ColorWindow, &ColorTemplateGadgets[COLOR_BLUE], bluepos, 3, 0);
  555.     RefreshGList(&ColorTemplateGadgets[COLOR_BLUE], ColorWindow, NULL, 3);
  556. }
  557.  
  558. /* ======================================================================= */
  559. /* === And finally, the Main Entry Point ================================= */
  560. /* ======================================================================= */
  561.  
  562. BOOL
  563. DoCWind(screen, left, top, firstpen, usergb)
  564.     struct Screen  *screen;
  565.     WORD        left, top, firstpen;
  566.     BOOL        usergb;
  567. {
  568.     struct IntuiMessage *message;
  569.     ULONG        class;
  570.     struct Gadget  *gadget;
  571.     BOOL        mousemoved;
  572.     WORD        x, y, code, i;
  573.     struct Remember *key;
  574.     UWORD       *ptr;
  575.     BOOL        retvalue;
  576.  
  577.     key = NULL;
  578.     retvalue = FALSE;
  579.  
  580.     if (ColorWindow)
  581.     goto DONE;
  582.  
  583.     ColorNewWindow.LeftEdge = left;
  584.     ColorNewWindow.TopEdge = top;
  585.  
  586.     if (usergb)
  587.     ColorTemplateGadgets[COLOR_HSL_RGB].Flags &= ~SELECTED;
  588.     else
  589.     ColorTemplateGadgets[COLOR_HSL_RGB].Flags |= SELECTED;
  590.  
  591.     if ((ptr = (UWORD *) AllocRemember(&key, RGBHSL_SIZE * 2, MEMF_CHIP)) == NULL)
  592.     goto DONE;
  593.     ColorRGBImage.ImageData = ptr;
  594.     for (i = 0; i < RGBHSL_SIZE; i++)
  595.     *ptr++ = RGBData[i];
  596.     if ((ptr = (UWORD *) AllocRemember(&key, RGBHSL_SIZE * 2, MEMF_CHIP)) == NULL)
  597.     goto DONE;
  598.     ColorHSLImage.ImageData = ptr;
  599.     for (i = 0; i < RGBHSL_SIZE; i++)
  600.     *ptr++ = HSLData[i];
  601.  
  602.     if (NOT OpenColorWindow(screen, firstpen & 0x3F))
  603.     goto DONE;
  604.  
  605.     retvalue = TRUE;
  606.  
  607.     FOREVER
  608.     {
  609.     Wait(1 << ColorWindow->UserPort->mp_SigBit);
  610.  
  611.     mousemoved = FALSE;
  612.     while (message = GetMsg(ColorWindow->UserPort)) {
  613.         class = message->Class;
  614.         code = message->Code;
  615.         gadget = (struct Gadget *) (message->IAddress);
  616.         x = message->MouseX;
  617.         y = message->MouseY;
  618.         ReplyMsg(message);
  619.  
  620.         switch (class) {
  621.         case GADGETDOWN:
  622.         case GADGETUP:
  623.         if (ColorGadgetGotten(gadget) == FALSE)
  624.             goto DONE;
  625.         break;
  626.         case MOUSEMOVE:
  627.         mousemoved = TRUE;
  628.         break;
  629.         case MOUSEBUTTONS:
  630.         if (code == SELECTDOWN)
  631.             ColorWindowHit(x, y);
  632.         break;
  633.         }
  634.     }
  635.     if (mousemoved)
  636.         ModifyColors();
  637.     SetPoint(ColorWindow);
  638.     }
  639.  
  640.   DONE:
  641.     FreeRemember(&key, TRUE);
  642.     return (retvalue);
  643. }
  644.